﻿using System.Text.RegularExpressions;

namespace CSharpPro._1103;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

// UserService实现类
public class UserServiceImpl : IUserService
{
    // 使用泛型集合保存注册用户信息
    private List<User> users = new List<User>();
    private IUserService _userServiceImplementation;

    public bool Register(string username, string password, string confirmPassword)
    {
        // 验证输入
        if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
        {
            Console.WriteLine("用户名和密码不可为空！");
            return false;
        }
        
        if (!ValidateUsername(username))
        {
            Console.WriteLine("用户名不符合规则！长度3-15个字符，只能包含字母、数字、下划线");
            return false;
        }
        
        if (IsUsernameExists(username))
        {
            Console.WriteLine("用户名已存在，请选择其他用户名！");
            return false;
        }
        
        if (!ValidatePassword(password))
        {
            Console.WriteLine("密码不符合规则！长度6-20个字符，必须包含至少1个大写字母、1个小写字母和1个数字");
            return false;
        }
        
        if (password != confirmPassword)
        {
            Console.WriteLine("两次输入的密码不一致！");
            return false;
        }
        
        // 创建新用户并添加到集合
        User newUser = new User(username, password);
        users.Add(newUser);
        Console.WriteLine($"注册成功！欢迎 {username}！");
        return true;
    }
    
    public bool Login(string username, string password)
    {
        if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
        {
            Console.WriteLine("用户名和密码不可为空！");
            return false;
        }
        
        // 使用foreach循环查找用户
        foreach (User user in users)
        {
            if (user.Username == username && user.Password == password)
            {
                Console.WriteLine($"登录成功！欢迎回来，{username}！");
                return true;
            }
        }
        
        Console.WriteLine("用户名或密码错误！");
        return false;
    }
    
    public bool ChangePassword(string username, string oldPassword, string newPassword, string confirmNewPassword)
    {
        User user = GetUserInfo(username);
        if (user == null)
        {
            Console.WriteLine("用户不存在！");
            return false;
        }
        
        if (user.Password != oldPassword)
        {
            Console.WriteLine("原密码错误！");
            return false;
        }
        
        if (!ValidatePassword(newPassword))
        {
            Console.WriteLine("新密码不符合规则！");
            return false;
        }
        
        if (newPassword != confirmNewPassword)
        {
            Console.WriteLine("两次输入的新密码不一致！");
            return false;
        }
        
        user.Password = newPassword;
        Console.WriteLine("密码修改成功！");
        return true;
    }
    
    public User GetUserInfo(string username)
    {
        // 使用foreach循环查找用户
        foreach (User user in users)
        {
            if (user.Username == username)
            {
                return user;
            }
        }
        return null;
    }
    
    public List<User> GetAllUsers()
    {
        return new List<User>(users); // 返回副本保护原始数据
    }
    
    public bool DeleteUser(string username)
    {
        // 使用for循环进行删除操作（避免foreach的修改异常）
        for (int i = 0; i < users.Count; i++)
        {
            if (users[i].Username == username)
            {
                users.RemoveAt(i);
                Console.WriteLine($"用户 {username} 删除成功！");
                return true;
            }
        }
        
        Console.WriteLine($"用户 {username} 不存在！");
        return false;
    }
    
    public bool IsUsernameExists(string username)
    {
        // 使用foreach循环检查用户名是否存在
        foreach (User user in users)
        {
            if (user.Username == username)
            {
                return true;
            }
        }
        return false;
    }
    
    public bool ValidateUsername(string username)
    {
        // 长度3-15个字符
        if (username.Length < 3 || username.Length > 15)
            return false;
        
        // 只能包含字母、数字、下划线
        Regex regex = new Regex("^[a-zA-Z0-9_]+$");
        return regex.IsMatch(username);
    }
    
    public bool ValidatePassword(string password)
    {
        // 长度6-20个字符
        if (password.Length < 6 || password.Length > 20)
            return false;
        
        // 必须包含至少1个大写字母、1个小写字母和1个数字
        bool hasUpper = password.Any(char.IsUpper);
        bool hasLower = password.Any(char.IsLower);
        bool hasDigit = password.Any(char.IsDigit);
        
        return hasUpper && hasLower && hasDigit;
    }
    
    // 获取用户数量
    public int GetUserCount()
    {
        return users.Count;
    }

    public List<User> SearchUsers(string keyword)
    {
        return _userServiceImplementation.SearchUsers(keyword);
    }

    public bool UpdateUser(User user)
    {
        return _userServiceImplementation.UpdateUser(user);
    }
}